{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Supervised graph classification with Deep Graph CNN"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "source": [
    "<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/graph-classification/dgcnn-graph-classification.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/graph-classification/dgcnn-graph-classification.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook demonstrates how to train a graph classification model in a supervised setting using the Deep Graph Convolutional Neural Network (DGCNN) [1] algorithm.\n",
    "\n",
    "In supervised graph classification, we are given a collection of graphs each with an attached categorical label. For example, the PROTEINS dataset we use for this demo is a collection of graphs each representing a chemical compound and labelled as either an enzyme or not. Our goal is to train a machine learning model that uses the graph structure of the data together with any information available for the graph's nodes, e.g., chemical properties for the compounds in PROTEINS, to predict the correct label for a previously unseen graph; a previously unseen graph is one that was not used for training and validating the model.\n",
    "\n",
    "The DGCNN architecture was proposed in [1] (see Figure 5 in [1]) using the graph convolutional layers from [2] but with a modified propagation rule (see [1] for details). DGCNN introduces a new `SortPooling` layer to generate a representation (also know as embedding) for each given graph using as input the representations learned for each node via a stack of graph convolutional layers. The output of the `SortPooling` layer is then used as input to one-dimensional convolutional, max pooling, and dense layers that learn graph-level features suitable for predicting graph labels.\n",
    "\n",
    "**References**\n",
    "\n",
    "[1] An End-to-End Deep Learning Architecture for Graph Classification, M. Zhang, Z. Cui, M. Neumann, Y. Chen, AAAI-18. ([link](https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/viewPaper/17146))\n",
    "\n",
    "[2] Semi-supervised Classification with Graph Convolutional Networks, T. N. Kipf and M. Welling, ICLR 2017. ([link](https://arxiv.org/abs/1609.02907))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "outputs": [],
   "source": [
    "# install StellarGraph if running on Google Colab\n",
    "import sys\n",
    "if 'google.colab' in sys.modules:\n",
    "  %pip install -q stellargraph[demos]==1.2.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "VersionCheck"
    ]
   },
   "outputs": [],
   "source": [
    "# verify that we're using the correct version of StellarGraph for this notebook\n",
    "import stellargraph as sg\n",
    "\n",
    "try:\n",
    "    sg.utils.validate_notebook_version(\"1.2.1\")\n",
    "except AttributeError:\n",
    "    raise ValueError(\n",
    "        f\"This notebook requires StellarGraph version 1.2.1, but a different version {sg.__version__} is installed.  Please see <https://github.com/stellargraph/stellargraph/issues/1172>.\"\n",
    "    ) from None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "import stellargraph as sg\n",
    "from stellargraph.mapper import PaddedGraphGenerator\n",
    "from stellargraph.layer import DeepGraphCNN\n",
    "from stellargraph import StellarGraph\n",
    "\n",
    "from stellargraph import datasets\n",
    "\n",
    "from sklearn import model_selection\n",
    "from IPython.display import display, HTML\n",
    "\n",
    "from tensorflow.keras import Model\n",
    "from tensorflow.keras.optimizers import Adam\n",
    "from tensorflow.keras.layers import Dense, Conv1D, MaxPool1D, Dropout, Flatten\n",
    "from tensorflow.keras.losses import binary_crossentropy\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import the data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "DataLoadingLinks"
    ]
   },
   "source": [
    "(See [the \"Loading from Pandas\" demo](../basics/loading-pandas.ipynb) for details on how data can be loaded.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "DataLoading"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "Each graph represents a protein and graph labels represent whether they are are enzymes or non-enzymes. The dataset includes 1113 graphs with 39 nodes and 73 edges on average for each graph. Graph nodes have 4 attributes (including a one-hot encoding of their label), and each graph is labelled as belonging to 1 of 2 classes."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dataset = datasets.PROTEINS()\n",
    "display(HTML(dataset.description))\n",
    "graphs, graph_labels = dataset.load()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `graphs` value is a list of many `StellarGraph` instances, each of which has a few node features:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StellarGraph: Undirected multigraph\n",
      " Nodes: 42, Edges: 162\n",
      "\n",
      " Node types:\n",
      "  default: [42]\n",
      "    Features: float32 vector, length 4\n",
      "    Edge types: default-default->default\n",
      "\n",
      " Edge types:\n",
      "    default-default->default: [162]\n",
      "        Weights: all 1 (default)\n",
      "        Features: none\n"
     ]
    }
   ],
   "source": [
    "print(graphs[0].info())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StellarGraph: Undirected multigraph\n",
      " Nodes: 27, Edges: 92\n",
      "\n",
      " Node types:\n",
      "  default: [27]\n",
      "    Features: float32 vector, length 4\n",
      "    Edge types: default-default->default\n",
      "\n",
      " Edge types:\n",
      "    default-default->default: [92]\n",
      "        Weights: all 1 (default)\n",
      "        Features: none\n"
     ]
    }
   ],
   "source": [
    "print(graphs[1].info())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Summary statistics of the sizes of the graphs:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nodes</th>\n",
       "      <th>edges</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1113.0</td>\n",
       "      <td>1113.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>39.1</td>\n",
       "      <td>145.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>45.8</td>\n",
       "      <td>169.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>4.0</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>15.0</td>\n",
       "      <td>56.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>26.0</td>\n",
       "      <td>98.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>45.0</td>\n",
       "      <td>174.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>620.0</td>\n",
       "      <td>2098.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        nodes   edges\n",
       "count  1113.0  1113.0\n",
       "mean     39.1   145.6\n",
       "std      45.8   169.3\n",
       "min       4.0    10.0\n",
       "25%      15.0    56.0\n",
       "50%      26.0    98.0\n",
       "75%      45.0   174.0\n",
       "max     620.0  2098.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary = pd.DataFrame(\n",
    "    [(g.number_of_nodes(), g.number_of_edges()) for g in graphs],\n",
    "    columns=[\"nodes\", \"edges\"],\n",
    ")\n",
    "summary.describe().round(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The labels are `1` or `2`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>663</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>450</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   label\n",
       "1    663\n",
       "2    450"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "graph_labels.value_counts().to_frame()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "graph_labels = pd.get_dummies(graph_labels, drop_first=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Prepare graph generator\n",
    "\n",
    "To feed data to the `tf.Keras` model that we will create later, we need a data generator. For supervised graph classification, we create an instance of `StellarGraph`'s `PaddedGraphGenerator` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = PaddedGraphGenerator(graphs=graphs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create the Keras graph classification model\n",
    "\n",
    "We are now ready to create a `tf.Keras` graph classification model using `StellarGraph`'s `DeepGraphCNN` class together with standard `tf.Keras` layers `Conv1D`, `MapPool1D`, `Dropout`, and `Dense`. \n",
    "\n",
    "The model's input is the graph represented by its adjacency and node features matrices. The first four layers are Graph Convolutional as in [2] but using the adjacency normalisation from [1], $D^{-1}A$ where $A$ is the adjacency matrix with self loops and $D$ is the corresponding degree matrix. The graph convolutional layers each have 32, 32, 32, 1 units and `tanh` activations. \n",
    "\n",
    "The next layer is a one dimensional convolutional layer, `Conv1D`, followed by a max pooling, `MaxPool1D`, layer. Next is a second `Conv1D` layer that is followed by two `Dense` layers the second used for binary classification. The convolutional and dense layers use `relu` activation except for the last dense layer that uses `sigmoid` for classification. As described in [1], we add a `Dropout` layer after the first `Dense` layer."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](dgcnn_architecture.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First we create the base DGCNN model that includes the graph convolutional and `SortPooling` layers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "k = 35  # the number of rows for the output tensor\n",
    "layer_sizes = [32, 32, 32, 1]\n",
    "\n",
    "dgcnn_model = DeepGraphCNN(\n",
    "    layer_sizes=layer_sizes,\n",
    "    activations=[\"tanh\", \"tanh\", \"tanh\", \"tanh\"],\n",
    "    k=k,\n",
    "    bias=False,\n",
    "    generator=generator,\n",
    ")\n",
    "x_inp, x_out = dgcnn_model.in_out_tensors()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we add the convolutional, max pooling, and dense layers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_out = Conv1D(filters=16, kernel_size=sum(layer_sizes), strides=sum(layer_sizes))(x_out)\n",
    "x_out = MaxPool1D(pool_size=2)(x_out)\n",
    "\n",
    "x_out = Conv1D(filters=32, kernel_size=5, strides=1)(x_out)\n",
    "\n",
    "x_out = Flatten()(x_out)\n",
    "\n",
    "x_out = Dense(units=128, activation=\"relu\")(x_out)\n",
    "x_out = Dropout(rate=0.5)(x_out)\n",
    "\n",
    "predictions = Dense(units=1, activation=\"sigmoid\")(x_out)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we create the `Keras` model and prepare it for training by specifying the loss and optimisation algorithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Model(inputs=x_inp, outputs=predictions)\n",
    "\n",
    "model.compile(\n",
    "    optimizer=Adam(lr=0.0001), loss=binary_crossentropy, metrics=[\"acc\"],\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train the model\n",
    "\n",
    "We can now train the model using the model's `fit` method.\n",
    "\n",
    "But first we need to split our data to training and test sets. We are going to use 90% of the data for training and the remaining 10% for testing. This 90/10 split is the equivalent of a single fold in the 10-fold cross validation scheme used in [1]."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_graphs, test_graphs = model_selection.train_test_split(\n",
    "    graph_labels, train_size=0.9, test_size=None, stratify=graph_labels,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Given the data split into train and test sets, we create a `StellarGraph.PaddedGenerator` generator object that prepares the data for training. We create data generators suitable for training at `tf.keras` model by calling the latter generator's `flow` method specifying the train and test data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "gen = PaddedGraphGenerator(graphs=graphs)\n",
    "\n",
    "train_gen = gen.flow(\n",
    "    list(train_graphs.index - 1),\n",
    "    targets=train_graphs.values,\n",
    "    batch_size=50,\n",
    "    symmetric_normalization=False,\n",
    ")\n",
    "\n",
    "test_gen = gen.flow(\n",
    "    list(test_graphs.index - 1),\n",
    "    targets=test_graphs.values,\n",
    "    batch_size=1,\n",
    "    symmetric_normalization=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note**: We set the number of epochs to a large value so the call to `model.fit(...)` later might take a long time to complete. For faster performance set `epochs` to a smaller value; but if you do accuracy of the model found may be low."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "tags": [
     "parameters"
    ]
   },
   "outputs": [],
   "source": [
    "epochs = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now train the model by calling it's `fit` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  ['...']\n",
      "  ['...']\n",
      "Train for 21 steps, validate for 112 steps\n",
      "Epoch 1/100\n",
      "21/21 [==============================] - 3s 139ms/step - loss: 0.6640 - acc: 0.5824 - val_loss: 0.6188 - val_acc: 0.5982\n",
      "Epoch 2/100\n",
      "21/21 [==============================] - 2s 74ms/step - loss: 0.6526 - acc: 0.6234 - val_loss: 0.6003 - val_acc: 0.6429\n",
      "Epoch 3/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.6468 - acc: 0.6643 - val_loss: 0.5987 - val_acc: 0.7411\n",
      "Epoch 4/100\n",
      "21/21 [==============================] - 2s 76ms/step - loss: 0.6361 - acc: 0.7123 - val_loss: 0.5843 - val_acc: 0.7321\n",
      "Epoch 5/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.6301 - acc: 0.7143 - val_loss: 0.5786 - val_acc: 0.7500\n",
      "Epoch 6/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.6061 - acc: 0.7073 - val_loss: 0.5716 - val_acc: 0.7500\n",
      "Epoch 7/100\n",
      "21/21 [==============================] - 2s 81ms/step - loss: 0.6129 - acc: 0.7173 - val_loss: 0.5626 - val_acc: 0.7500\n",
      "Epoch 8/100\n",
      "21/21 [==============================] - 2s 82ms/step - loss: 0.6274 - acc: 0.7163 - val_loss: 0.5637 - val_acc: 0.7411\n",
      "Epoch 9/100\n",
      "21/21 [==============================] - 2s 84ms/step - loss: 0.5985 - acc: 0.7243 - val_loss: 0.5606 - val_acc: 0.7411\n",
      "Epoch 10/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.6066 - acc: 0.7223 - val_loss: 0.5568 - val_acc: 0.7411\n",
      "Epoch 11/100\n",
      "21/21 [==============================] - 2s 82ms/step - loss: 0.5956 - acc: 0.7273 - val_loss: 0.5530 - val_acc: 0.7411\n",
      "Epoch 12/100\n",
      "21/21 [==============================] - 2s 75ms/step - loss: 0.5852 - acc: 0.7203 - val_loss: 0.5493 - val_acc: 0.7500\n",
      "Epoch 13/100\n",
      "21/21 [==============================] - 2s 81ms/step - loss: 0.5995 - acc: 0.7233 - val_loss: 0.5482 - val_acc: 0.7500\n",
      "Epoch 14/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5898 - acc: 0.7303 - val_loss: 0.5452 - val_acc: 0.7411\n",
      "Epoch 15/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.6028 - acc: 0.7233 - val_loss: 0.5467 - val_acc: 0.7589\n",
      "Epoch 16/100\n",
      "21/21 [==============================] - 2s 84ms/step - loss: 0.5850 - acc: 0.7223 - val_loss: 0.5444 - val_acc: 0.7500\n",
      "Epoch 17/100\n",
      "21/21 [==============================] - 2s 80ms/step - loss: 0.5793 - acc: 0.7243 - val_loss: 0.5436 - val_acc: 0.7589\n",
      "Epoch 18/100\n",
      "21/21 [==============================] - 2s 87ms/step - loss: 0.5705 - acc: 0.7133 - val_loss: 0.5413 - val_acc: 0.7500\n",
      "Epoch 19/100\n",
      "21/21 [==============================] - 2s 78ms/step - loss: 0.5829 - acc: 0.7263 - val_loss: 0.5426 - val_acc: 0.7411\n",
      "Epoch 20/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.5796 - acc: 0.7133 - val_loss: 0.5423 - val_acc: 0.7411\n",
      "Epoch 21/100\n",
      "21/21 [==============================] - 2s 93ms/step - loss: 0.5772 - acc: 0.7053 - val_loss: 0.5397 - val_acc: 0.7321\n",
      "Epoch 22/100\n",
      "21/21 [==============================] - 2s 79ms/step - loss: 0.5818 - acc: 0.7143 - val_loss: 0.5378 - val_acc: 0.7500\n",
      "Epoch 23/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5733 - acc: 0.7133 - val_loss: 0.5381 - val_acc: 0.7321\n",
      "Epoch 24/100\n",
      "21/21 [==============================] - 2s 85ms/step - loss: 0.5670 - acc: 0.7143 - val_loss: 0.5390 - val_acc: 0.7321\n",
      "Epoch 25/100\n",
      "21/21 [==============================] - 2s 81ms/step - loss: 0.5688 - acc: 0.7143 - val_loss: 0.5374 - val_acc: 0.7321\n",
      "Epoch 26/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5671 - acc: 0.7103 - val_loss: 0.5372 - val_acc: 0.7232\n",
      "Epoch 27/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5639 - acc: 0.7103 - val_loss: 0.5362 - val_acc: 0.7232\n",
      "Epoch 28/100\n",
      "21/21 [==============================] - 2s 96ms/step - loss: 0.5732 - acc: 0.7143 - val_loss: 0.5377 - val_acc: 0.7321\n",
      "Epoch 29/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5655 - acc: 0.7073 - val_loss: 0.5363 - val_acc: 0.7232\n",
      "Epoch 30/100\n",
      "21/21 [==============================] - 2s 82ms/step - loss: 0.5683 - acc: 0.7153 - val_loss: 0.5366 - val_acc: 0.7321\n",
      "Epoch 31/100\n",
      "21/21 [==============================] - 2s 84ms/step - loss: 0.5752 - acc: 0.7203 - val_loss: 0.5345 - val_acc: 0.7232\n",
      "Epoch 32/100\n",
      "21/21 [==============================] - 2s 96ms/step - loss: 0.5778 - acc: 0.7183 - val_loss: 0.5392 - val_acc: 0.7321\n",
      "Epoch 33/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5649 - acc: 0.7253 - val_loss: 0.5352 - val_acc: 0.7500\n",
      "Epoch 34/100\n",
      "21/21 [==============================] - 2s 87ms/step - loss: 0.5700 - acc: 0.7153 - val_loss: 0.5337 - val_acc: 0.7321\n",
      "Epoch 35/100\n",
      "21/21 [==============================] - 2s 74ms/step - loss: 0.5621 - acc: 0.7083 - val_loss: 0.5358 - val_acc: 0.7411\n",
      "Epoch 36/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.5729 - acc: 0.7273 - val_loss: 0.5371 - val_acc: 0.7232\n",
      "Epoch 37/100\n",
      "21/21 [==============================] - 2s 84ms/step - loss: 0.5735 - acc: 0.7153 - val_loss: 0.5316 - val_acc: 0.7321\n",
      "Epoch 38/100\n",
      "21/21 [==============================] - 2s 92ms/step - loss: 0.5694 - acc: 0.7043 - val_loss: 0.5309 - val_acc: 0.7411\n",
      "Epoch 39/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.5589 - acc: 0.7173 - val_loss: 0.5315 - val_acc: 0.7411\n",
      "Epoch 40/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5687 - acc: 0.7163 - val_loss: 0.5314 - val_acc: 0.7321\n",
      "Epoch 41/100\n",
      "21/21 [==============================] - ETA: 0s - loss: 0.5534 - acc: 0.728 - 2s 86ms/step - loss: 0.5523 - acc: 0.7283 - val_loss: 0.5301 - val_acc: 0.7411\n",
      "Epoch 42/100\n",
      "21/21 [==============================] - 2s 93ms/step - loss: 0.5596 - acc: 0.7113 - val_loss: 0.5306 - val_acc: 0.7411\n",
      "Epoch 43/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5518 - acc: 0.7193 - val_loss: 0.5293 - val_acc: 0.7500\n",
      "Epoch 44/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5579 - acc: 0.7153 - val_loss: 0.5299 - val_acc: 0.7500\n",
      "Epoch 45/100\n",
      "21/21 [==============================] - 2s 82ms/step - loss: 0.5565 - acc: 0.7253 - val_loss: 0.5276 - val_acc: 0.7500\n",
      "Epoch 46/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.5576 - acc: 0.7113 - val_loss: 0.5294 - val_acc: 0.7500\n",
      "Epoch 47/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.5624 - acc: 0.7203 - val_loss: 0.5291 - val_acc: 0.7500\n",
      "Epoch 48/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5552 - acc: 0.7223 - val_loss: 0.5268 - val_acc: 0.7500\n",
      "Epoch 49/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5536 - acc: 0.7223 - val_loss: 0.5250 - val_acc: 0.7589\n",
      "Epoch 50/100\n",
      "21/21 [==============================] - 2s 98ms/step - loss: 0.5693 - acc: 0.7153 - val_loss: 0.5281 - val_acc: 0.7589\n",
      "Epoch 51/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5521 - acc: 0.7243 - val_loss: 0.5256 - val_acc: 0.7589\n",
      "Epoch 52/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5536 - acc: 0.7203 - val_loss: 0.5217 - val_acc: 0.7589\n",
      "Epoch 53/100\n",
      "21/21 [==============================] - 2s 93ms/step - loss: 0.5489 - acc: 0.7143 - val_loss: 0.5197 - val_acc: 0.7679\n",
      "Epoch 54/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.5478 - acc: 0.7283 - val_loss: 0.5211 - val_acc: 0.7679\n",
      "Epoch 55/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5569 - acc: 0.7263 - val_loss: 0.5201 - val_acc: 0.7589\n",
      "Epoch 56/100\n",
      "21/21 [==============================] - 2s 101ms/step - loss: 0.5530 - acc: 0.7183 - val_loss: 0.5204 - val_acc: 0.7857\n",
      "Epoch 57/100\n",
      "21/21 [==============================] - 2s 91ms/step - loss: 0.5453 - acc: 0.7183 - val_loss: 0.5171 - val_acc: 0.7768\n",
      "Epoch 58/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.5390 - acc: 0.7303 - val_loss: 0.5161 - val_acc: 0.7857\n",
      "Epoch 59/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5410 - acc: 0.7283 - val_loss: 0.5128 - val_acc: 0.7857\n",
      "Epoch 60/100\n",
      "21/21 [==============================] - 2s 97ms/step - loss: 0.5602 - acc: 0.7213 - val_loss: 0.5173 - val_acc: 0.7679\n",
      "Epoch 61/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5449 - acc: 0.7243 - val_loss: 0.5138 - val_acc: 0.7768\n",
      "Epoch 62/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5492 - acc: 0.7243 - val_loss: 0.5125 - val_acc: 0.7768\n",
      "Epoch 63/100\n",
      "21/21 [==============================] - 2s 84ms/step - loss: 0.5466 - acc: 0.7213 - val_loss: 0.5161 - val_acc: 0.7768\n",
      "Epoch 64/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.5475 - acc: 0.7213 - val_loss: 0.5135 - val_acc: 0.7768\n",
      "Epoch 65/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5409 - acc: 0.7243 - val_loss: 0.5125 - val_acc: 0.7857\n",
      "Epoch 66/100\n",
      "21/21 [==============================] - 2s 95ms/step - loss: 0.5404 - acc: 0.7303 - val_loss: 0.5095 - val_acc: 0.7857\n",
      "Epoch 67/100\n",
      "21/21 [==============================] - 2s 85ms/step - loss: 0.5453 - acc: 0.7213 - val_loss: 0.5029 - val_acc: 0.7857\n",
      "Epoch 68/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.5374 - acc: 0.7293 - val_loss: 0.5086 - val_acc: 0.7768\n",
      "Epoch 69/100\n",
      "21/21 [==============================] - 2s 97ms/step - loss: 0.5409 - acc: 0.7353 - val_loss: 0.5077 - val_acc: 0.7768\n",
      "Epoch 70/100\n",
      "21/21 [==============================] - 2s 92ms/step - loss: 0.5439 - acc: 0.7293 - val_loss: 0.5043 - val_acc: 0.7857\n",
      "Epoch 71/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5330 - acc: 0.7313 - val_loss: 0.5090 - val_acc: 0.7768\n",
      "Epoch 72/100\n",
      "21/21 [==============================] - 2s 82ms/step - loss: 0.5328 - acc: 0.7303 - val_loss: 0.5092 - val_acc: 0.7768\n",
      "Epoch 73/100\n",
      "21/21 [==============================] - 2s 84ms/step - loss: 0.5333 - acc: 0.7273 - val_loss: 0.5098 - val_acc: 0.7857\n",
      "Epoch 74/100\n",
      "21/21 [==============================] - 2s 96ms/step - loss: 0.5384 - acc: 0.7313 - val_loss: 0.5049 - val_acc: 0.7679\n",
      "Epoch 75/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.5417 - acc: 0.7233 - val_loss: 0.5086 - val_acc: 0.7768\n",
      "Epoch 76/100\n",
      "21/21 [==============================] - 2s 81ms/step - loss: 0.5364 - acc: 0.7253 - val_loss: 0.5088 - val_acc: 0.7589\n",
      "Epoch 77/100\n",
      "21/21 [==============================] - 2s 89ms/step - loss: 0.5365 - acc: 0.7313 - val_loss: 0.5083 - val_acc: 0.7768\n",
      "Epoch 78/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5378 - acc: 0.7363 - val_loss: 0.5084 - val_acc: 0.7679\n",
      "Epoch 79/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5373 - acc: 0.7293 - val_loss: 0.5049 - val_acc: 0.7768\n",
      "Epoch 80/100\n",
      "21/21 [==============================] - 2s 87ms/step - loss: 0.5344 - acc: 0.7373 - val_loss: 0.5063 - val_acc: 0.7679\n",
      "Epoch 81/100\n",
      "21/21 [==============================] - 2s 87ms/step - loss: 0.5344 - acc: 0.7313 - val_loss: 0.5039 - val_acc: 0.7679\n",
      "Epoch 82/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5304 - acc: 0.7363 - val_loss: 0.5078 - val_acc: 0.7589\n",
      "Epoch 83/100\n",
      "21/21 [==============================] - 2s 93ms/step - loss: 0.5382 - acc: 0.7303 - val_loss: 0.5116 - val_acc: 0.7589\n",
      "Epoch 84/100\n",
      "21/21 [==============================] - 2s 79ms/step - loss: 0.5315 - acc: 0.7293 - val_loss: 0.4988 - val_acc: 0.7500\n",
      "Epoch 85/100\n",
      "21/21 [==============================] - 2s 91ms/step - loss: 0.5358 - acc: 0.7293 - val_loss: 0.4974 - val_acc: 0.7679\n",
      "Epoch 86/100\n",
      "21/21 [==============================] - 2s 77ms/step - loss: 0.5424 - acc: 0.7283 - val_loss: 0.5009 - val_acc: 0.7679\n",
      "Epoch 87/100\n",
      "21/21 [==============================] - 2s 88ms/step - loss: 0.5300 - acc: 0.7403 - val_loss: 0.5085 - val_acc: 0.7768\n",
      "Epoch 88/100\n",
      "21/21 [==============================] - 2s 82ms/step - loss: 0.5436 - acc: 0.7253 - val_loss: 0.5046 - val_acc: 0.7500\n",
      "Epoch 89/100\n",
      "21/21 [==============================] - 2s 90ms/step - loss: 0.5346 - acc: 0.7323 - val_loss: 0.5002 - val_acc: 0.7589\n",
      "Epoch 90/100\n",
      "21/21 [==============================] - 2s 91ms/step - loss: 0.5323 - acc: 0.7373 - val_loss: 0.5056 - val_acc: 0.7679\n",
      "Epoch 91/100\n",
      "21/21 [==============================] - 2s 93ms/step - loss: 0.5290 - acc: 0.7313 - val_loss: 0.5071 - val_acc: 0.7589\n",
      "Epoch 92/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5340 - acc: 0.7313 - val_loss: 0.5086 - val_acc: 0.7679\n",
      "Epoch 93/100\n",
      "21/21 [==============================] - 2s 98ms/step - loss: 0.5271 - acc: 0.7313 - val_loss: 0.5063 - val_acc: 0.7679\n",
      "Epoch 94/100\n",
      "21/21 [==============================] - 2s 83ms/step - loss: 0.5236 - acc: 0.7413 - val_loss: 0.5102 - val_acc: 0.7679\n",
      "Epoch 95/100\n",
      "21/21 [==============================] - 2s 86ms/step - loss: 0.5237 - acc: 0.7333 - val_loss: 0.5103 - val_acc: 0.7411\n",
      "Epoch 96/100\n",
      "21/21 [==============================] - 2s 95ms/step - loss: 0.5196 - acc: 0.7353 - val_loss: 0.5110 - val_acc: 0.7768\n",
      "Epoch 97/100\n",
      "21/21 [==============================] - 2s 94ms/step - loss: 0.5250 - acc: 0.7293 - val_loss: 0.5076 - val_acc: 0.7411\n",
      "Epoch 98/100\n",
      "21/21 [==============================] - 2s 87ms/step - loss: 0.5259 - acc: 0.7403 - val_loss: 0.5087 - val_acc: 0.7679\n",
      "Epoch 99/100\n",
      "21/21 [==============================] - 2s 99ms/step - loss: 0.5315 - acc: 0.7413 - val_loss: 0.5080 - val_acc: 0.7679\n",
      "Epoch 100/100\n",
      "21/21 [==============================] - 2s 93ms/step - loss: 0.5292 - acc: 0.7313 - val_loss: 0.5223 - val_acc: 0.7589\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(\n",
    "    train_gen, epochs=epochs, verbose=1, validation_data=test_gen, shuffle=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let us plot the training history (losses and accuracies for the train and test data)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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o6P5xS9+0aBrbN++nbFjxzJu3Dhee+01cnJyuO222w6pFxsby9NPP0337t3ZuHEjt9xyC7feeisvvvgip512Gn/605+YOnUqO3bsqK5flyeffJKf//znTJ8+nXPOOYcPP/yQ22+/nXbt2vHDH/6wut4TTzzB3XffzeLFi/niiy+49tprOfHEE2vUCRYF8CbKLyjRADYRkQAJCQlcccUVvPTSS9UBPDMzk6ysLGbPnk1ERAQPP/xwdf1evXqxceNGnnzyyQYH8CeffJLk5GRmzpxJVFQUgwYN4te//jWXXXZZjXo/+9nPalznN7/5DRMmTOD555/H5/NVd5XX1z3/yCOP8JOf/ISbbroJgPT0dNauXcvDDz9cIzifeeaZ3HPPPdV1nn/+eT744AMF8JYov6CUpHgNYBORMGhEFtzcbrjhBi6//HJ2795NamoqL730EqNHj6Z///6Av5v9mWeeYcuWLRQWFlJeXk5lZWWDz5+VlcXo0aNrjFQ/44wzDqk3e/ZsHn/8cTZs2MCBAweorKyktLSUnTt3NnhA3IEDB8jOzuass86qUf6d73yH6dOnU1RURFxcHADDhw+vUadDBJdxAAAgAElEQVRr165s3ry5wffVGHoG3kT5haXKwEVEarnwwgtJTk5m1qxZlJWV8dprr3HDDTcA8MYbb3DLLbcwfvx45s2bxxdffMH9999PWVlZUNuwePFivv/973PWWWfx1ltvsWzZMp566ikASktLg3qtKj5fzXhgZo36w6QxlIE3UX5BiUagi4jUEhkZybXXXsvLL79Mnz592L9/PxMmTABgwYIFjBgxgjvv/HbNri1btjTq/IMGDeLll1+moqKCyMhIABYuXFijzmeffUZycjK/+tWvqsvefPPNGnWqAm7geWpr3749aWlpLFiwgLFjx1aXf/LJJ/Tu3bs6+w43ZeBNUFpeyYHici2jKiJSh4kTJ7Js2TIeeOABxo4dS2JiIgD9+/dn5cqVzJkzh40bNzJ9+nRmz57dqHPffPPN5ObmctNNN7FmzRo+/PBD7rvvvhp1+vfvT25uLs8++yybNm3ipZde4sknn6xRp3fv3gDMnTuX3NxcCgoK6rzetGnTeOKJJ5g5cybr16/nL3/5C3/+85+59957G9XuYFIAb4I93jKq6kIXETnU0KFDGT58OMuXL2fixInV5VOmTOH666/n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\n",
      "text/plain": [
       "<Figure size 504x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sg.utils.plot_history(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, let us calculate the performance of the trained model on the test data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  ['...']\n",
      "112/112 [==============================] - 0s 1ms/step - loss: 0.5223 - acc: 0.7589\n",
      "\n",
      "Test Set Metrics:\n",
      "\tloss: 0.5223\n",
      "\tacc: 0.7589\n"
     ]
    }
   ],
   "source": [
    "test_metrics = model.evaluate(test_gen)\n",
    "print(\"\\nTest Set Metrics:\")\n",
    "for name, val in zip(model.metrics_names, test_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Conclusion\n",
    "\n",
    "We demonstrated the use of `StellarGraph`'s `DeepGraphCNN` implementation for supervised graph classification algorithm. More specifically we showed how to  predict whether a chemical compound represented as a graph is an enzyme or not.\n",
    "\n",
    "Performance is similar to that reported in [1] but a small difference does exist. This difference can be attributed to a small number of factors listed below, \n",
    "- We use a different training scheme, that is a single 90/10 split of the data as opposed to the repeated 10-fold cross validation scheme used in [1]. We use a single fold for ease of exposition. \n",
    "- The experimental evaluation scheme in [1] does not specify some important details such as: the regularisation used for the neural network layers; if a bias term is included; the weight initialization method used; and the batch size."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "source": [
    "<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/graph-classification/dgcnn-graph-classification.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/graph-classification/dgcnn-graph-classification.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
